/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import br.Modelo.Pedido;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 *
 * @author Administrador
 */
public class PedidoDAO {
    
    private static final int cnstNavPri = 0;
    private static final int cnstNavAnt = 1;
    private static final  int cnstNavProx = 2;
    private static final int cnstNavUlt = 3;
    
    public static int PegaProximoCodigo()
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         Statement consulta = null;
         ResultSet resultado = null;
         int ProximoCodigo = 1;
         
         String sql = "SELECT MAX(codigo_pedido) AS maior_codigo FROM Pedido;";
         
         try
         {
             consulta = (Statement)conexao.createStatement();
             resultado = consulta.executeQuery(sql);
             
             resultado.next();
             ProximoCodigo = resultado.getInt("maior_codigo");
             ProximoCodigo++;
         }
         catch(SQLException e)
         {
             JOptionPane.showMessageDialog(null, "Erro na execução da função PegaProximoCodigo" + e.getMessage());
         }
         finally
         {
             try
             {
                 consulta.close();
                 resultado.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 JOptionPane.showMessageDialog(null,"Erro ao fechar a conexão" + e.getMessage());
             }
             finally
             {
                 return ProximoCodigo;
             }
         }
     }
    
    
    public static void Salvar(Pedido pedido)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         PreparedStatement insereSt = null;
         
         String sql = ("insert into Pedido(codigo_pedido, data_pedido, codigo_pedido_produto, codigo_pedido_cliente, numero_pedido, valor_pedido) "
                 + "values(?, ?, ?, ?, ?, ?)");
         int NumProdutos = 0;
         NumProdutos = pedido.getProduto_pedido().size();
         try
         {
             insereSt = conexao.prepareStatement(sql);
             for(int i =0; i<NumProdutos; i++){
                 insereSt.setInt(1, PegaProximoCodigo());
                 if(pedido.getData_pedido() == null)
                    insereSt.setTimestamp(2, new java.sql.Timestamp(new java.util.Date().getTime()));
                 else
                    insereSt.setTimestamp(2, pedido.getData_pedido());
                 insereSt.setDouble(3, pedido.getProduto_pedido().get(i).getCodigoProduto());
                 insereSt.setDouble(4, pedido.getCliente_pedido().getCodigoCliente());
                 insereSt.setInt(5, pedido.getNumero_pedido());
                 insereSt.setDouble(6, pedido.getValor_pedido());

                 insereSt.executeUpdate();
             }
         }
         catch(SQLException e)
         {
             JOptionPane.showMessageDialog(null, "Erro ao incluir cidade: " + e.getMessage());
         }
         finally
         {
             try
             {
                 insereSt.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 JOptionPane.showMessageDialog(null, "Erro ao fechar conexão: " + e.getMessage());
             }
         }
     }
    
    public static void Atualizar(Pedido pedido)
    {
        Excluir(pedido.getNumero_pedido());
        Connection conexao = FabricaConexao.GeraConexao();
         
         PreparedStatement insereSt = null;
         
         String sql = ("insert into Pedido(codigo_pedido, data_pedido, codigo_pedido_produto, codigo_pedido_cliente, numero_pedido, valor_pedido) "
                 + "values(?, ?, ?, ?, ?, ?)");
         int NumProdutos = 0;
         NumProdutos = pedido.getProduto_pedido().size();
         try
         {
             insereSt = conexao.prepareStatement(sql);
             for(int i =0; i<NumProdutos; i++){
                 insereSt.setInt(1, PegaProximoCodigo());
                 if(pedido.getData_pedido() == null)
                    insereSt.setTimestamp(2, new java.sql.Timestamp(new java.util.Date().getTime()));
                 else
                    insereSt.setTimestamp(2, pedido.getData_pedido());
                 insereSt.setDouble(3, pedido.getProduto_pedido().get(i).getCodigoProduto());
                 insereSt.setDouble(4, pedido.getCliente_pedido().getCodigoCliente());
                 insereSt.setInt(5, pedido.getNumero_pedido());
                 insereSt.setDouble(6, pedido.getValor_pedido());

                 insereSt.executeUpdate();
             }
         }
         catch(SQLException e)
         {
             JOptionPane.showMessageDialog(null, "Erro ao incluir cidade: " + e.getMessage());
         }
         finally
         {
             try
             {
                 insereSt.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 JOptionPane.showMessageDialog(null, "Erro ao fechar conexão: " + e.getMessage());
             }
         }
    }
    
    public static void Excluir(int NumeroPedido)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         PreparedStatement insereSt = null;
         
         String sql = ("DELETE FROM pedido WHERE numero_pedido = ?");
         
         try
         {
             insereSt = conexao.prepareStatement(sql);
             insereSt.setInt(1, NumeroPedido);
             insereSt.executeUpdate();
         }
         catch(SQLException e)
         {
             System.out.println("Erro ao excluir cliente: " + e.getMessage());
         }
         finally
         {
             try
             {
                 insereSt.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 JOptionPane.showMessageDialog(null, "Erro ao fechar a conexão" + e.getMessage());
             }
         }
     }
    
    
    public static String SQLNavegacao(int pOpcao, int pCodigoAtual)
      {
          String SQL = "";
          switch(pOpcao)
          {
              case cnstNavPri:
                  SQL = "SELECT MIN(codigo_pedido) AS cod FROM pedido";
                  break;
              case cnstNavAnt:
                  SQL = "SELECT MAX(codigo_pedido) AS cod FROM pedido WHERE codigo_pedido < " + String.valueOf(pCodigoAtual);
                  break;
              case cnstNavProx:
                  SQL = "SELECT MIN(codigo_pedido) AS cod FROM pedido WHERE codigo_pedido > " + String.valueOf(pCodigoAtual);
                  break;
              case cnstNavUlt:
                  SQL = "SELECT MAX(codigo_pedido) AS cod FROM pedido";
                  break;
          }
          return SQL;
      }
      
      public static int PegaCodigoPelaNavegacao(int pOpcao, int pCodigoAtual)
      {
          Connection conexao = FabricaConexao.GeraConexao();
          Statement consulta = null;
          ResultSet resultado = null;
          int CodigoEncontrado = -1;
          
          try{
              consulta = (Statement)conexao.createStatement();
              resultado = consulta.executeQuery(SQLNavegacao(pOpcao, pCodigoAtual));
              
              resultado.next();
              CodigoEncontrado = resultado.getInt("cod");
          }
          catch(Exception e){
              JOptionPane.showMessageDialog(null, "Erro ao executar sql de navegação: " + e.getMessage());
          }
          finally{
              try{
                  consulta.close();
                  conexao.close();
              }
              catch(Throwable e){
                  JOptionPane.showMessageDialog(null, "Erro ao fechar conexão com o BD: " + e.getMessage());
              }
          }
          
          return CodigoEncontrado;
      }
      
      public static ArrayList<String> RecuperarProdutos(int NumeroPedido){
         
          Connection conexao = FabricaConexao.GeraConexao();
          Statement consulta = null;
          ResultSet resultado = null;
          ArrayList<String> produtos = new ArrayList<String>();
          String SQL = "SELECT codigo_pedido_produto AS cod FROM pedido WHERE numero_pedido = " + NumeroPedido;
          try{
              consulta = (Statement)conexao.createStatement();
              resultado = consulta.executeQuery(SQL);
              
              while(resultado.next())
              produtos.add(String.valueOf(resultado.getInt("cod")));
          }
          catch(SQLException e){
              JOptionPane.showMessageDialog(null,"Erro ao recuperar os produtos do pedido: " + e.getMessage());
          }
          finally{
              try{
                  conexao.close();
                  consulta.close();
                  resultado.close();
              }
              catch(Throwable e){
                  JOptionPane.showMessageDialog(null, "Erro ao fechar conexão com o banco de dados: " + e.getMessage());
              }
          }
          
          return produtos;
      }
      
      public static int RecuperaCodigoCliente(int NumeroPedido){
          Connection conexao = FabricaConexao.GeraConexao();
          Statement consulta = null;
          ResultSet resultado = null;
          int pCodigo = 0;
          String SQL = "SELECT codigo_pedido_cliente AS cod FROM pedido WHERE numero_pedido = " + NumeroPedido;
          try{
              consulta = (Statement)conexao.createStatement();
              resultado = consulta.executeQuery(SQL);
              
              while(resultado.next())
              pCodigo = resultado.getInt("cod");
          }
          catch(SQLException e){
              JOptionPane.showMessageDialog(null, "Erro ao recuperar código do cliente: " + e);
          }
          finally{
              try{
                  conexao.close();
                  consulta.close();
                  resultado.close();
              }
              catch(Throwable e){
                  JOptionPane.showMessageDialog(null, "Erro ao fechar conexão com o banco de dados: " + e);
              }
          }
          
          return pCodigo;
      }
      
      public static ArrayList<Pedido> RecuperaPedidos(){
          ArrayList<Pedido> arrayPedido = new ArrayList<Pedido>();
          Pedido objPedido;
          Connection conexao = FabricaConexao.GeraConexao();
          Statement consulta = null;
          ResultSet resultado = null;
          String SQL = "SELECT * FROM pedido GROUP BY numero_pedido";
          try{
              consulta = (Statement)conexao.createStatement();
              resultado = consulta.executeQuery(SQL);
              
              while(resultado.next()){
                  objPedido = new Pedido();
                  objPedido.setNumero_pedido(resultado.getInt("numero_pedido"));
                  objPedido.setValor_pedido(resultado.getDouble("valor_pedido"));
                  arrayPedido.add(objPedido);
              }
          }
          catch(SQLException e){
              JOptionPane.showMessageDialog(null, "Erro ao recuperar código do cliente: " + e);
          }
          finally{
              try{
                  conexao.close();
                  consulta.close();
                  resultado.close();
              }
              catch(Throwable e){
                  JOptionPane.showMessageDialog(null, "Erro ao fechar conexão com o banco de dados: " + e);
              }
          }
          
          return arrayPedido;
      }
}
